package actor

import (
	"net"
	"time"

	"github.com/AsynkronIT/protoactor-go/actor"
	"github.com/gin-gonic/gin"

	nevent "nggs/event"
	nexport "nggs/export"
	nlog "nggs/log"
	npb "nggs/network/protocol/protobuf/v3"
	nrpc "nggs/rpc"
)

type IActor interface {
	PID() *actor.PID
	ParentPID() *actor.PID
	Sign() string
	SetSign(sign string)
	Logger() nlog.ILogger
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	Start(ctx actor.Context, name string) (err error)
	WaitForStarted()
	IsStopping() bool
	Stop() error
	WaitForStopped()
	StopAndWait() error
	Poison() error
	PoisonAndWait() error
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	Debug(format string, args ...interface{})
	Info(format string, args ...interface{})
	Warn(format string, args ...interface{})
	Error(format string, args ...interface{})
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	NewTimer(dur time.Duration, tag TimerTag, cb TimerCallback) TimerID
	NewLoopTimer(dur time.Duration, tag TimerID, cb TimerCallback) TimerID
	StopTimer(id TimerID) error
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	RegisterEventHandler(id nevent.ID, h nevent.Handler)
	DispatchEvent(iEvent nevent.IEvent, ctx actor.Context, args ...interface{}) (err error)
	PostEvent(iEvent nevent.IEvent)
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	NewHttpTask(timeout time.Duration, tag HttpTaskTag, prepare OnHttpTaskPrepare, callback OnHttpTaskCompleted) (taskID HttpTaskID, err error)
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	RegisterRPCHandler(id nrpc.MessageID, handler nrpc.MessageHandler) (err error)
	NewPromise() (promise *Promise)
	NewRPCPromise(iRequestMessage nrpc.IMessage, receiver *actor.PID, cb PromiseCallback) (promise *Promise)
	PromiseNum() int
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	RegisterMessageHandler(id npb.MessageID, handler npb.MessageHandler) (err error)
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	RegisterHttpRequestHandler(method string, pattern string, fn gin.HandlerFunc, option *HttpRequestHandlerOption) (err error)
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	HttpServerListener() net.Listener
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	WebsocketServerSessionNum() int
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	GetLogic(id nexport.LogicID) nexport.ILogic
	EachLogic(fn func(id nexport.LogicID, logic nexport.ILogic) (continued bool))
}
